package com.heima.wemedia.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.article.dto.ArticleDto;
import com.heima.feign.clients.ArticleClient;
import com.heima.wemedia.mapper.WmNewsMapper;
import com.heima.wemedia.pojo.WmNews;
import com.heima.wemedia.service.WmNewsAutoScanService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class WmNewsAutoScanServiceImpl extends ServiceImpl<WmNewsMapper, WmNews> implements WmNewsAutoScanService {

    @Autowired
    private ArticleClient client;


    /**
     * 这个接口是审核文章，成功后调用feign将文章存进Article文章，配置，内容表
     * 审核功能有待开发，目前默认审核成功
     * <p>
     * 调用feign将文章写进Article表
     * 操作三张表，文章表，文章配置表，文章详细内容表
     *
     * @param wmNewsId
     */
    @Override
    @Transactional
    public void save2Article(Integer wmNewsId) {
        //根据wmNewsId查询wmNew，因为前面已经存进数据库
        WmNews wmNews = getById(wmNewsId);

        ArticleDto articleDto = new ArticleDto();
        //属性拷贝，将dto属性拷进WmNews
        CopyOptions optionsFeign = CopyOptions.create()
                .setIgnoreNullValue(true)  // 忽略源对象属性为空的情况
                .setIgnoreError(true)
                .setIgnoreProperties("id");     // 忽略复制过程中出现的错误
        BeanUtil.copyProperties(wmNews, articleDto, optionsFeign);

        //这里根据接收的文章id，查一下自媒体文章是否存在，来判断是新增还是修改。若能查到，便将ArticleId赋给articleDto
        LambdaQueryWrapper<WmNews> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(WmNews::getId, wmNews.getId());
        WmNews wmNewsOne = getOne(queryWrapper);
        //将ArticleId赋给articleDto，无论查不查得到，因为在articleService里有对id的判断
        articleDto.setId(wmNewsOne.getArticleId());

        //添加或修改文章，并返回此文章id
        Long articleId = client.saveNews(articleDto);
        //得到文章id，将自媒体文章表里的Article_id回填。若为修改操作，也就是Article_id已存在也不影响，因为此时的articleId就是已存在的id
        LambdaUpdateWrapper<WmNews> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(WmNews::getId, wmNews.getId());
        updateWrapper.set(WmNews::getArticleId, articleId);
        update(updateWrapper);

        //添加或修改文章配置
        client.saveArticleConfig(articleId);

        //添加或修改文章内容，将文章id放进去
        articleDto.setId(articleId);
        client.saveContent(articleDto);

        //不要忘记生成文章详情html文件，上传至minio，且这个为异步方法
        client.upload2Minio(articleDto);

    }
}
